﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace DefensiveShield
{
    public static partial class OS
    {
        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- CHECK FILES INTEGRITY ------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция проверки целостности файлов
             * 
             * Файлы, которые были указаны, как файлы, которым необходима проверка целостности поочереди проверяются на наличие в них изменений с момента регистрации
             * 
             * Если была найдена ошибка целостности для одного из файлов, то необходимо обновить значение его хеш-суммы на новое, и указать полный путь к этому файлу в списке возвращаемых значений
             * 
            @return List<string> - список файлов, целостность которых была нарушена
            @return null - в случае ошибки
        */
        public static List<string> CheckFilesIntegrity()
        {
            var corruptedFiles = new List<string>();

            foreach (KeyValuePair<string, string> filenameHashPair in FileIntegrity)
            {
                // What should I return if file was not found?
                string fileContents = File.ReadAllText(filenameHashPair.Key),
                    fileHash = Hash(fileContents);

                if (fileHash != filenameHashPair.Value)
                    corruptedFiles.Add(filenameHashPair.Key);
            }

            DateLastIntegrityCheck = DateTime.Now;

            return corruptedFiles;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- CHECK FILES INTEGRITY ------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция пересчёта контрольных сумм файлов, добавленных в список отслеживания целостности файлов
             * 
             * Для файлов, которые были указаны, как файлы, которым необходима проверка целостности, поочереди пересчитывается контрольная сумма
             * 
            @return ErrorCodes - код ошибки при её наличии
        */
        public static ErrorCodes RecalculateFilesIntegrityControlSums()
        {
            try
            {
                foreach (KeyValuePair<string, string> filenameHashPair in FileIntegrity)
                {
                    string fileContents = File.ReadAllText(filenameHashPair.Key);
                    FileIntegrity[filenameHashPair.Key] = Hash(fileContents);
                }
            }
            catch (IOException)
            {
                return ErrorCodes.UnknownError; // File not found
            }

            return ErrorCodes.NoError;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- ADD FILE TO INTEGRITY CHECKER
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция добавления файла к списку файлов, для которых возможна проверка целостности
            @return код ошибки, при её наличии
        */
        public static ErrorCodes AddFileToIntegrityChecker(string fileName)
        {
            FileIntegrity.Add(fileName, "Не проверен");

            return ErrorCodes.NoError;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- REMOVE FILE FROM INTEGRITY -
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция удаления файла из списка файлов, для которых возможна проверка целостности
            @return код ошибки, при её наличии
        */
        public static ErrorCodes RemoveFileFromIntegrityChecker(string fileName)
        {
            FileIntegrity.Remove(fileName);

            return ErrorCodes.NoError;
        }
    }
}
